package com.kapcb.context.core;

import com.kapcb.context.bean.ThreadContext;

import java.util.Map;
import java.util.Set;

/**
 * <a>Title: IThreadContext </a>
 * <a>Author: kapcb <a>
 * <a>Description: IThreadContext <a>
 *
 * @author kapcb
 * @version 1.0
 * @date 2024/4/20 1:23 PM
 * @since 1.0
 */
public interface IThreadContext {

    /**
     * 初始化线程上下文
     */
    void init();

    /**
     * 存放数据到线程上下文
     *
     * @param key   键
     * @param value 值
     * @return 值
     */
    <T> T put(String key, T value);

    /**
     * 根据 key 获取线程上下文中的数据
     *
     * @param key 键
     * @return 值
     */
    <T> T get(String key);

    /**
     * 根据 key 移除线程上下文中的数据
     *
     * @param key 键
     * @return 值
     */
    <T> T remove(String key);

    /**
     * 清除线程上下文
     */
    void clearContext();

    /**
     * 浅拷贝线程上下文数据
     *
     * @return 线程上下文容器
     */
    ThreadContext copyContext();

    /**
     * 深拷贝线程上下文内容
     *
     * @return 线程上下文容器
     */
    ThreadContext deepCopyContext();

    /**
     * 获取线程上下文的所有 k
     *
     * @return 线程上下文的所有 k
     */
    Set<String> keySet();

    /**
     * 获取线程上下文的所有 k-v 集合
     *
     * @return 线程上下文的所有 k-v 集合
     */
    Set<Map.Entry<String, Object>> entrySet();

}
